package com.gonsin.gview.general;

import com.gonsin.gview.general.generator.AllGenerator;
import com.gonsin.gview.general.po.ConfigPo;
import com.gonsin.gview.general.po.EntityPo;
import com.gonsin.gview.general.po.FieldPo;
import com.gonsin.gview.general.utils.CharUtils;
import com.gonsin.gview.general.utils.CmdUtils;
import com.gonsin.gview.general.utils.TypeUtils;
import com.google.gson.Gson;
import org.apache.commons.io.FileUtils;
import org.ini4j.Ini;
import org.ini4j.Wini;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        System.out.println("欢迎使用GView项目创建工具");
        new Main().run(args);
    }


    public static ConfigPo CONFIG = null;


    /**
     * 执行创建项目
     */
    public void run(String[] args){

        // TODO 获取配置文件内容
        try {
            Wini ini = new Wini(new File("general.ini"));
            initConfig(ini);
        } catch (IOException e) {
            System.out.println("没有找到配置文件'general.ini'");
            return;
        }
        String outPath = CmdUtils.readCmd("输出目录（为空表示当前目录）：", true);

        boolean last = isLast(args);
        EntityPo entity = null;
        List<FieldPo> fieldList = null;
        if(last){
            try {
                File l = new File(".last");
                if(l.exists()){
                    String json = FileUtils.readFileToString(new File(".last"), "UTF8");
                    entity = new Gson().fromJson(json, EntityPo.class);
                    fieldList = entity.getFieldList();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

        if(entity == null){
            entity = new EntityPo();
            entity.setPackageName(CmdUtils.readCmd("输入包名(例如 com.gonsin.venus.meeting)：", false).trim().toLowerCase());
            entity.setDbTableName(CmdUtils.readCmd("输入数据库表名，不包含全局前缀(例如 meeting_topic)：", false).trim().toLowerCase());
            entity.setEntityName(CmdUtils.readCmd("实体类名字（例如 Topic，则会生成TopicBean.java、ITopicService.java、TopicServiceImpl.java等文件）：", false));
            entity.setEntityNameUnderline(CharUtils.camelToUnderline(entity.getEntityName()).toLowerCase());
            entity.setEntityNameFirstLower(CharUtils.firstLowercase(entity.getEntityName()));
            entity.setEntityNameFullUpperCase(CharUtils.camelToUnderline(entity.getEntityName()).toUpperCase());
            entity.setEntityLabel(CmdUtils.readCmd("实体类含义（例如输入“议题” 等 ：", false).trim().toLowerCase());
            entity.setCreateTime(new SimpleDateFormat("yyyy/MM/dd").format(new Date()));

            fieldList = new ArrayList<>();
            entity.setFieldList(fieldList);
        }

        String enter = null;
        int index = fieldList.size() + 1;
        while(true){
            FieldPo f = new FieldPo();
            System.out.println("正在输入第" + index + "个变量");
            enter = CmdUtils.readCmd("输入变量名字改（例如 username、password），输入#退出：", false).trim();
            if(enter.equals("#")){
                break;
            }
            f.setName(enter);
            f.setNameUnderline(CharUtils.camelToUnderline(enter).toLowerCase());
            f.setType(CmdUtils.readCmd("输入该变量的类型（例如 String、int、byte、double等）：", false));
            f.setDbType(TypeUtils.getDbType(f.getType()));
            f.setComment(CmdUtils.readCmd("输入该变量的含义（例如 用户名、密码等）：", false));
            f.setTableCanSee(CmdUtils.readBoolean("该变量能否在列表查看(Y/n)：", true));
            f.setNeedCreate(CmdUtils.readBoolean("在添加时候，是否需要该字段(Y/n)：", true));
            f.setNeedUpdate(CmdUtils.readBoolean("在修改时候，是否需要该字段(Y/n)：", true));
            f.setNullable(CmdUtils.readBoolean("该字段是否可空(Y/n)：", true));
            f.setSearchable(CmdUtils.readBoolean("该字段是否可用于搜索条件(N/y)：", false));
            if("String".equals(f.getType()) && f.isSearchable()){
                f.setSupportFuzzySearch(CmdUtils.readBoolean("该字段支持模糊搜索(N/y)：", false));
            }
            fieldList.add(f);
            System.out.println("完成第" + index + "个变量的输入");
            index++;
        }

        System.out.println("保存本次输入，如发生任何意外，你可以通过命令 `gproject --last` 或 `gproject -l` 恢复本次输入");
        // 保存本次输入
        String json = new Gson().toJson(entity);
        try {
            FileUtils.writeStringToFile(new File(".last"), json, "UTF8");
        } catch (IOException e) {
            e.printStackTrace();
//            throw new RuntimeException(e);
        }

        new AllGenerator().general(new File(outPath), entity);

    }

    /**
     * 是否使用上一次
     */
    private boolean isLast(String[] args) {
        if(args == null || args.length == 0){
            return false;
        }
        for(String a : args){
            if("-l".equals(a)){
                return true;
            }
            if("--last".equals(a)){
                return true;
            }
        }
        return false;
    }

    private void initConfig(Wini ini) {
        Ini.Section section = ini.get("env");
        ConfigPo config = new ConfigPo();
        config.setTablePrefix(section.get("table_name_prefix"));
        config.setCharset(section.get("charset"));
        CONFIG = config;
    }

}
